/*
 * EntidadFisica.cpp
 *
 *  Created on: Oct 4, 2013
 *      Author: Hernan
 */

#include "EntidadFisica.h"
#include <iostream>
using namespace std;
typedef struct InfoEntidad {
   string *nombre;
   EntidadFisica *entidad;
   bool* eliminado;
} InfoEntidad ;

EntidadFisica::EntidadFisica(string tipo){
	this->definicionCuerpoFisico = new b2BodyDef();
	this->entidadDerecha = NULL;
	this->entidadIzquierda = NULL;
	this->tipo = tipo;
	this->pelotaAdentro = false;
	this->eliminado = false;
}

float EntidadFisica::obtenerPosicionX(){
	return this->cuerpoFisico->GetPosition().x;
}

float EntidadFisica::obtenerPosicionY(){
	return this->cuerpoFisico->GetPosition().y;
}

float EntidadFisica::obtenerAngulo(){
	return this->cuerpoFisico->GetAngle();
}

float EntidadFisica::obtenerVelocidadAngular(){
	return this->cuerpoFisico->GetAngularVelocity();
}

b2Vec2 EntidadFisica::obtenerVelocidadLineal(){
	return this->cuerpoFisico->GetLinearVelocity();
}

b2FixtureDef* EntidadFisica::obtenerFixture(){
	return this->fixture;
}

b2Body* EntidadFisica::obtenerCuerpo(){
	return this->cuerpoFisico;
}

b2BodyDef* EntidadFisica::obtenerBodyDef(){
	return this->definicionCuerpoFisico;
}

EntidadFisica::~EntidadFisica() {
	// TODO Auto-generated destructor stub
}

void EntidadFisica::setearElementosAJointear(EntidadFisica* entidadIzquierda,EntidadFisica* entidadDerecha){
	this->aJointearInicial = entidadIzquierda;
	this->aJointearFinal = entidadDerecha;
}

void EntidadFisica::agregarEntidadIzquierda(EntidadFisica* entidadFisicaI){
	this->entidadIzquierda = entidadFisicaI;

}

void EntidadFisica::agregarEntidadDerecha(EntidadFisica* entidadFisicaD){
	this->entidadDerecha = entidadFisicaD;
}

string  EntidadFisica::getTipo(){
	return tipo;
}

void EntidadFisica::guardarInformacionDeEntidad(){
	InfoEntidad* info= (InfoEntidad*)malloc(sizeof(InfoEntidad));
	info->nombre= new string(this->tipo);
	info->entidad = this;
	info->eliminado = &(this->eliminado);
	this->cuerpoFisico->SetUserData(info);

}

void EntidadFisica::jointear(b2World* world){}

void EntidadFisica::aplicarFuerzasFisicas(){}


float EntidadFisica::getAncho(){
	return this->ancho;
}

float EntidadFisica::getAlto(){
	return this->alto;
}

void EntidadFisica::eliminarEntidadFisica(){
	this->eliminado =true;
}

bool EntidadFisica::estaEliminado(){
	return this->eliminado;
}

void EntidadFisica::setAnclajePolea(pair<int,int> anclaje){
	this->posAnclajePolea = anclaje;

}
pair<int,int> EntidadFisica::getAnclajePolea(){
	return this->posAnclajePolea;
}


// este metodo por defecto es asi, aunque algunas entidades fisicas lo sobreescriben segun convenga.//

void EntidadFisica::destruirEntidadFisica(){
	b2World* world = this->cuerpoFisico->GetWorld();
	world->DestroyBody(this->cuerpoFisico);
}

